﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ComunesMGI.DataTypes;
using ComunesMGI.Constantes;
using System.Data;
using System.Configuration;

namespace MGI.AccesoDatos.AccesoBD
{
    class BDWorkPackages
    {
        public bool addWorkPackage(DataSistema sistema, DataWP workPackage)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando="DarEstadoInicialWP";
            SqlCommand cmdEstIni = new SqlCommand(textoComando, cnn);
            SqlDataReader lector;
            
            try
            {
                //obtenemos le estado inicial, con el que se dara de alta el wp
                cnn.Open();
                lector = cmdEstIni.ExecuteReader();
                int estadoInicial=0;
                if (lector.Read())
                {
                    estadoInicial = (int)lector["WkpEstCod"];
                }
                else
                {
                    //excepcion!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                }
                lector.Close();

                //llamamos al stored procedure AgregarWorkPackage
                if((workPackage.FechaInicio).Equals(ConstantesMGI.FechaVacia))
                {
                      //tirar excepcion!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                }
                textoComando = "AgregarWorkPackage";


                SqlCommand cmd = new SqlCommand(textoComando, cnn);
                cmd.CommandType = CommandType.StoredProcedure;
          
                SqlParameter nombreWP = new SqlParameter("@WkpNom", workPackage.Nombre);
                SqlParameter fchIniWP = new SqlParameter("@WkpFchIni", workPackage.FechaInicio);
                SqlParameter fchEntWP = new SqlParameter("@WkpFchEnt", SqlDbType.DateTime);
                SqlParameter fchEntEstWP  = new SqlParameter("@WkpFchEntEst", SqlDbType.DateTime);
                SqlParameter fchFinWP = new SqlParameter("@WkpFchFin", SqlDbType.DateTime);
                SqlParameter esfTotWP = new SqlParameter("@WkpEsfTot", SqlDbType.Int);
                SqlParameter esfResWP = new SqlParameter("@WkpEsfRes ",SqlDbType.Int);
                SqlParameter estIniWP = new SqlParameter("@WkpEstCod ", estadoInicial);
                SqlParameter sisWP = new SqlParameter("@SisCod ", sistema.Codigo);
                
                  if((workPackage.FechaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                     fchEntWP.IsNullable = true;
                     fchEntWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntWP.Value = workPackage.FechaEntrega;
                }
                if((workPackage.FechaEstimadaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                      fchEntEstWP.IsNullable = true;
                      fchEntEstWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntEstWP.Value = workPackage.FechaEstimadaEntrega;
                }
                if((workPackage.FechaFin).Equals(ConstantesMGI.FechaVacia))
                {
                      fchFinWP.IsNullable = true;
                      fchFinWP.Value = DBNull.Value;
                }
                else
                {
                    fchFinWP.Value = workPackage.FechaFin;  
                }
                if(workPackage.EsfuerzoTotal == ConstantesMGI.EnteroVacio)
                {
                    esfTotWP.IsNullable = true;
                    esfTotWP.Value = DBNull.Value;
                }
                else
                {
                    esfTotWP.Value = workPackage.EsfuerzoTotal;
                }
                 if(workPackage.EsfuerzoRestante == ConstantesMGI.EnteroVacio)
                {
                    esfResWP.IsNullable = true;
                    esfResWP.Value = DBNull.Value;
                }
                else
                {
                    esfResWP.Value = workPackage.EsfuerzoRestante;
                }
                  
                int afectados = -1;
                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(nombreWP);
                cmd.Parameters.Add(fchIniWP);
                cmd.Parameters.Add(fchEntWP);
                cmd.Parameters.Add(fchEntEstWP);
                cmd.Parameters.Add(fchFinWP);
                cmd.Parameters.Add(esfResWP);
                cmd.Parameters.Add(esfTotWP);
                cmd.Parameters.Add(estIniWP);
                cmd.Parameters.Add(sisWP);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                afectados = (int)cmd.Parameters["@retorno"].Value;
                //verificamos los campos vacios
            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }

            return true;//ver excepciones!!!!!!!!!!!!!!!!!!!!!!!!!!
        }

        public List<DataWP> getWorkPackages(DataSistema sistema)
        {
            List<DataWP> listaWP = new List<DataWP>();
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "getWorkPackagesSistema";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@SisCod", sistema.Codigo);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();
                while (lector.Read())
                {

                    int id = (int)lector["WkpCod"];
                    string nombre = (string)lector["WkpNom"];
                    DateTime fIni = (DateTime)lector["WkpFchIni"];
                    DateTime fEnt;
                    if (lector["WkpFchEnt"] == DBNull.Value)
                    {
                        fEnt = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEnt = (DateTime)lector["WkpFchEnt"];
                    }
                    DateTime fEntEst = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchEntEst"] == DBNull.Value)
                    {
                        fEntEst = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEntEst = (DateTime)lector["WkpFchEntEst"];
                    }
                    DateTime fFin = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchFin"] == DBNull.Value)
                    {
                        fFin = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fFin = (DateTime)lector["WkpFchFin"];
                    }
                    int esfTot = 0;
                    if (lector["WkpEsfTot"] == DBNull.Value)
                    {
                        esfTot = ConstantesMGI.EnteroVacio;
                    }
                    else
                    {
                       esfTot = (int)lector["WkpEsfTot"];
                    }
                    int esfRes = 0;
                    if (lector["WkpEsfRes"] == DBNull.Value)
                    {
                        esfTot = ConstantesMGI.EnteroVacio;
                    }
                    else
                    {
                        esfTot = (int)lector["WkpEsfRes"];
                    }
                    DataEstadoWP estado = new DataEstadoWP();
                    estado.Codigo = (int)lector["WkpEstCod"];
                    estado.Estado = (string)lector["WkpEstNom"];
                    DataWP wp = new DataWP(id, nombre, fIni, fEntEst, fEnt, fFin,esfTot, esfRes, estado);
                    listaWP.Add(wp);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaWP;
        }
    }
}
